package com.mjk.common.core.jdbc.service.idgenerator.impl;

import com.mjk.common.base.model.BaseEntity;
import com.mjk.common.core.jdbc.service.idgenerator.IdGenerator;
import com.mjk.common.core.jdbc.service.plus.idbservice.BeeDBService;
import com.mjk.common.core.jdbc.service.plus.wrap.BeeQueryWrapper;
import com.mjk.common.core.jdbc.util.TableUtils;
import com.mjk.common.core.jdbc.util.provider.SqlProvider;
import com.mjk.common.core.redis.datatype.RedisUtils;
import com.mjk.common.tools.logger.BizLogger;
import com.mjk.common.tools.springextend.BeeSpringBean;
import com.mjk.common.util.ObjectUtils;
import com.mjk.common.util.ReflectionUtils;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 自增主键生成策略
 */
public class IncrGenerateImpl implements IdGenerator {
    /**
     * 用于记录每个表的最大记录
     * 如果没有查询数据库中的最大值记录
     */
    private Map<String, Integer> maxMap = new HashMap<>();

    @Override
    public String getId(BaseEntity entity) {
        //获取主键
        String key = getKey(entity);
        RedisTemplate template = BeeSpringBean.getBean(RedisTemplate.class);
        if (null != template && RedisUtils.exists(template, key)) {
            return RedisUtils.incrby(template, key, 1) + "";
        }
        if (maxMap.containsKey(key)) {
            Integer currentValue = maxMap.get(key) + 1;
            maxMap.put(key, currentValue);
            return currentValue.toString();
        }
        //如果不存在需要表里面获取最大值
        Integer maxId = getMaxId(entity);
        //如果要全局一直 需要保存到redis中

        if (null != template) {
            RedisUtils.set(template, key, maxId);
        } else {
            maxMap.put(key, maxId);
        }
        return (maxId + 1) + "";
    }
}
